home *** CD-ROM | disk | FTP | other *** search
/ Aminet 8 / Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso / Aminet / comm / envoy / EnvoyEmpire.lha / source / EnvoyClient.c next >
C/C++ Source or Header  |  1995-07-19  |  74KB  |  1,923 lines

  1. #include "defines.h"
  2. #include "guidefines.h"
  3. #include "struct.h"
  4. #include <envoy/nipc.h>
  5. #include <envoy/services.h>
  6.  
  7. #include <envoy/errors.h>
  8. #include <clib/nipc_protos.h>
  9. #include <clib/services_protos.h>
  10. #include <pragmas/nipc_pragmas.h>
  11. #include <pragmas/services_pragmas.h>
  12.  
  13. #include "MUIEmpire_rev.h"
  14.  
  15. #define ICEEMPIRE 10
  16. near long __stack = 20000L;
  17.  
  18. struct RDArgs   *RDA=NULL;
  19.  
  20. enum args
  21.     {
  22.     HOST,
  23.   NAME,
  24.   PASSWORD,
  25.   GAME
  26.   };
  27.  
  28. struct Library *NIPCBase=NULL,*ServicesBase=NULL;
  29. struct Library *MUIMasterBase=NULL;
  30. extern struct WBStartup *WBenchMsg;
  31.  
  32. char name[30]     = "None\0";
  33. char host[50]     = "None\0";
  34. char password[30] = "None\0";
  35. char game[30]     = "None\0";
  36. char none[]       = "None Given\0";
  37. void fail (APTR,char *);
  38.  
  39. #ifdef _DCC
  40.  
  41. int brkfunc(void) { return(0); }
  42.  
  43. int wbmain(struct WBStartup *wb_startup)
  44. {
  45.         extern int main(int argc, char *argv[]);
  46.         return (main(0, NULL));
  47. }
  48.  
  49. #endif
  50.  
  51.  
  52. #ifdef __SASC
  53. int CXBRK(void) { return(0); }
  54. int _CXBRK(void) { return(0); }
  55. void chkabort(void) {}
  56. #endif
  57.  
  58.  
  59. static VOID init(VOID)
  60. {
  61. #ifdef _DCC
  62.         onbreak(brkfunc);
  63. #endif
  64.  
  65. #ifndef _DCC
  66.         if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)))
  67.                 fail(NULL,"Failed to open "MUIMASTER_NAME".");
  68. #endif
  69.  
  70.  
  71. #ifndef _DCC
  72.         if (!(UtilityBase = OpenLibrary("utility.library",37)))
  73.                 fail(NULL,"Failed to open Utility Library");
  74. #endif
  75. }
  76.  
  77.  
  78. #ifndef __SASC
  79. static VOID stccpy(char *dest,char *source,int len)
  80. {
  81.         strncpy(dest,source,len);
  82.         dest[len-1]='\0';
  83. }
  84. #endif
  85.  
  86.  
  87. #ifndef MAKE_ID
  88. #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
  89. #endif
  90.  
  91.  
  92. #define DEBUG FALSE
  93.  
  94.  
  95. const char  *popitem[] = {
  96.                           "Credits",            
  97.                           "Fuel",
  98.                           "Troops",
  99.                           "Planetary Scanner I",
  100.                           "Machinery", 
  101.                           "Space Mine I", 
  102.                           "Space Mine II",      
  103.                           "Space Mine III",     
  104.                           "Space Mine IV",        
  105.                           "Steel",              
  106.                           "Gold",               
  107.                           "Iron",               
  108.                           "Wool",                        
  109.                           "Grain",              
  110.                           "Uranium",            
  111.                           "Plutonium",          
  112.                           "Textile",            
  113.                           "Rubber",             
  114.                           "Mainframes",         
  115.                           "Spices",
  116.                           "Technology",             
  117.                           "Alcohol",            
  118.                           "Narcotics",          
  119.                           "Refinery",           
  120.                           "HyperGate",          
  121.                           "Plasma Torpedo",      
  122.                           "High Energy Laser",  
  123.                           "Disruptor",          
  124.                           "Torpedo",            
  125.                           "Vaporizer",          
  126.                           "10 Shield Energy",   
  127.                           "50 Shield Energy",   
  128.                           "100 Shield Energy",  
  129.                           "200 Shield Energy",  
  130.                           "400 Shield Energy",  
  131.                           "600 Shield Energy",                                           
  132.                           NULL,};
  133.                           
  134. const char *pages2[] = {"Automatic Navigation","Automatic Trade",NULL,};
  135. const char *pages3[] = {"Planet Information","Fleet Information","Sector Information","Player Information",NULL,};
  136. const char *pages4[] = {"Planet Inventory","Sector Inventory",NULL,};
  137. const char *pages5[] = {"Sector Inventory","Fleet Inventory",NULL,};
  138. const char *contact1[] = {"Patrol Mission","Trade Mission",NULL,};
  139. const char *contact2[] = {"New Orders","Keep Orders","Cycle Orders",NULL,};
  140. char *players[] = { NULL };
  141.  
  142. struct Sector *firstsector=NULL,*lastsector=NULL;  
  143. struct Empires *firstempire=NULL,*lastempire=NULL;
  144.   
  145.  
  146. extern struct Image mapimages1;
  147. extern struct Image mapimages2;
  148. extern struct Image mapimages3;
  149. extern struct Image mapimages4;
  150. extern struct Image mapimages5;
  151. extern struct Image mapimages6;
  152.  
  153. APTR tx1,tx2,tx3,tx4,tx5,tx6,tx7,tx8,tx9,tx10,tx11,tx12,tx13,tx14; 
  154. APTR tx15,tx16,tx17,tx18,tx19,tx20,tx21,tx22,tx23,tx24,tx25,tx26,tx27;
  155. APTR tx28,tx29,tx30,tx31,tx32;
  156. APTR lv1,lv2,lv3,lv4,lv5,lv6,pcy1,pgr1,pcy2,pgr2;
  157. APTR lv7,lv8,lv9,lv10,lv11,lv12,lv13,lv14,lv15,lv16,lv17,lv18;
  158. APTR str5,str6,str7,str8,str9,str10,str11,str12;
  159. APTR app,sc1,str1,str2,str3,str4,im1,BT_NextPlanet,BT_LastPlanet,BT_NextPlayer;
  160. APTR BT_Hyper,BT_Movement,BT_ApplyTrade,BT_CancelTrade;
  161. APTR WI_Movement, WI_Purchase, WI_PlanetCargo, WI_Player, WI_Mainwindow;
  162. APTR WI_FleetCargo,WI_ShipDesign;
  163. APTR WI_Map,WI_Configuration,WI_Gauge,ra1,ra2,ck1,ck2;
  164. APTR cy2,sl1,sl2,sl3,sl4,sl5,sl6,sl7,sl8,sl9,sl10,sl11,sl12,sl13;
  165. APTR sl14,sl15,sl16,sl17,sl18,sl19,sl20,sl21,sl22,sl30,sl31,sl32,sl33,sl34;
  166. APTR sl35,sl36,sl37,sl38,sl39,sl40,sl41,sl42,sl43,sl44;
  167. APTR strip,pop1,pop2,gauge1,SuperClass;
  168. APTR Hypergroup;
  169. APTR BT_AutoFuel;
  170. APTR BT_Sellship,BT_Showships;
  171. APTR MyObj,reg1,reg2;
  172. APTR BT_Purchase, BT_Quit,BT_LastPlayer;
  173. APTR BT_FleetCargo,BT_Map,BT_Cancel,BT_PlanetCargo;
  174. APTR BT_Done,BT_LoadGame,BT_AddPlayer,BT_RemovePlayer;
  175. APTR BT_ClearCourse;
  176. APTR BT_NextForce,BT_LastForce,BT_MakePurchase,BT_PlotCourse;
  177. APTR BT_NextFleet,BT_LastFleet;
  178. APTR BT_PurchaseShip,BT_ShipDesign,BT_PurchaseDesign;
  179. APTR BT_SectorTransferFle;
  180. APTR BT_SectorTransferPla;
  181. APTR BT_PlanetTransferSec;
  182. APTR BT_FleetTransferSec;
  183. APTR BT_SellGoods;
  184. APTR BT_SendPartial;
  185. APTR BT_SendMessage;
  186. APTR BT_ClearMessage;
  187. APTR BT_JoinFleet,WI_Login,str13,str14,str15,BT_PlayGame,tx33,tx34,vi1;   
  188. APTR BT_SetProduction,BT_ClearProduction,tx35;
  189. APTR WI_Fleet,WI_Sector,WI_Message;
  190.  
  191.  
  192. ULONG memory=0;
  193. LONG client=0;
  194. struct IClass *MyClass;
  195. int  fromx,fromy,toy,tox;
  196. char *sex,*age,*pops,*gip;
  197. char temp1[30],temp2[30];
  198. extern struct Image mapbackground;
  199. LONG GALAXY=0,id=-1;
  200. int playernumber=0,planetnumber=0;
  201. short chan,chanpri;
  202. struct Entity *in, *out;
  203. ULONG signals=NULL;
  204.  
  205. /*
  206.  * prototypes
  207.  */
  208. extern int imagesetup (void);
  209. int   senddata (struct Entity *myentity,struct Entity *serverentity,int length, short datatype, LONG datamessage,APTR data);
  210. LONG  guiRequest(LONG);
  211. int   empire_talk(struct Entity *, struct Entity *);
  212. int   processdata (struct Entity *in, struct Entity *out,struct Transaction *mmsg); 
  213. ULONG guiinput (void);
  214. LONG  *ParseParameters(int argc, char *OriginalTemplate);
  215. BOOL  parse( int argc );
  216. LONG  *ParseParameters(int argc, char *OriginalTemplate);
  217. void  FreeParameters(LONG *ArgumentArray);
  218.  
  219.  
  220. __saveds __asm struct temp *consfleet(register __a0 struct Hook *hook,
  221.                                       register __a2 APTR mem_pool,
  222.                                       register __a1 struct force *fleet);
  223. __saveds __asm LONG desfleet(register __a0 struct Hook *hook,
  224.                              register __a2 APTR mem_pool,
  225.                              register __a1 struct temp *fleet);
  226. __saveds __asm LONG dispfleet(register __a0 struct Hook *hook,
  227.                              register __a2 char **array,
  228.                              register __a1 struct temp *fleet);
  229.  
  230. __saveds __asm struct tagchar *constag  (register __a0 struct Hook *hook,
  231.                                         register __a2 APTR mem_pool,
  232.                                         register __a1 struct tagchar *tag);
  233. __saveds __asm LONG destag  (register __a0 struct Hook *hook,
  234.                              register __a2 APTR mem_pool,
  235.                              register __a1 struct tagchar *tag);
  236. __saveds __asm LONG disptag (register __a0 struct Hook *hook,
  237.                              register __a2 char **array,
  238.                              register __a1 struct tagchar *tag);
  239. __saveds __asm LONG disppurch (register __a0 struct Hook *hook,
  240.                                register __a2 char **array,
  241.                                register __a1 struct tagchar *tag);
  242. __saveds __asm LONG dispship(register __a0 struct Hook *hook, 
  243.                             register __a2 char **array,
  244.                             register __a1 struct shiptag *ship);
  245. __saveds __asm struct shiptag *consship(register __a0 struct Hook *hook,
  246.                                         register __a2 APTR mem_pool,
  247.                                         register __a1 struct ship *ship);
  248. __saveds __asm LONG desship (register __a0 struct Hook *hook,
  249.                              register __a2 APTR mem_pool,
  250.                              register __a1 struct shiptag *ship);
  251.  
  252.  
  253.  
  254.  
  255.  
  256. static struct NewMenu MenuData1[] = {
  257.   {NM_TITLE, "Project"        , 0 , 0 , 0      ,(APTR)0},
  258.   {NM_ITEM,  "About"          ,"?", 0 , 0      ,(APTR)ID_ABOUT},
  259. /*  
  260.   {NM_ITEM,  NM_BARLABEL      , 0 , 0 , 0      ,(APTR)0},
  261.   {NM_ITEM,  "Save Game"      ,"S", 0 , 0      ,(APTR)MEN_SAVEGAME},
  262.   {NM_ITEM,  "Save Game as.." , 0 , 0 , 0      ,(APTR)MEN_SAVEGAMEAS},
  263. */
  264.   {NM_ITEM,  NM_BARLABEL      , 0 , 0 , 0      ,(APTR)0},
  265.   {NM_ITEM,  "Quit"           ,"Q", 0 , 0      ,(APTR)ID_QUIT},
  266.   {NM_TITLE, "Windows"        , 0 , 0 , 0      ,(APTR)0},
  267.   {NM_ITEM,  "Fleet Window"   , 0 , 0 , 0      ,(APTR)ID_FLEETWINDOW},
  268.   {NM_ITEM,  "Sector Window"  , 0 , 0 , 0      ,(APTR)ID_SECTORWINDOW},
  269.   {NM_ITEM,  "Message window" , 0 , 0 , 0      ,(APTR)ID_MESSAGEWINDOW},
  270.  
  271. /*
  272.   {NM_TITLE, "Settings"       , 0 , 0 , 0      ,(APTR)0},
  273.   {NM_ITEM,  "Show Ships"     , 0 , 0 , 0      ,(APTR)MEN_SHOWSHIPS},   
  274. */
  275.   {NM_END,    NULL            , 0 , 0 , 0      ,(APTR)0},
  276.   };
  277.   
  278.   
  279. struct ship *shiptag,transports,fighters,destroyers,lightcruisers,heavycruisers,dreadnoughts;
  280. struct course *headcourse=NULL,*lastcourse=NULL;
  281.  
  282. static struct Hook fleet_list_dsphook = {
  283.         {NULL, NULL},
  284.         (void *)dispfleet,
  285.         NULL, NULL
  286. };
  287. static struct Hook fleet_list_deshook = {
  288.         {NULL, NULL},
  289.         (void *)desfleet,
  290.         NULL, NULL
  291. };
  292. static struct Hook fleet_list_conhook = {
  293.         {NULL, NULL},
  294.         (void *)consfleet,
  295.         NULL, NULL
  296. };
  297. static struct Hook ship_list_dsphook = {
  298.         {NULL, NULL},
  299.         (void *)dispship,
  300.         NULL, NULL
  301. };
  302. static struct Hook ship_list_deshook = {
  303.         {NULL, NULL},
  304.         (void *)desship,
  305.         NULL, NULL
  306. };
  307. static struct Hook ship_list_conhook = {
  308.         {NULL, NULL},
  309.         (void *)consship,
  310.         NULL, NULL
  311. };
  312.  
  313. static struct Hook fleet_list_dsptag = {
  314.         {NULL, NULL},
  315.         (void *)disptag,
  316.         NULL, NULL
  317. };
  318.  
  319. static struct Hook fleet_list_dsppurch = {
  320.         {NULL, NULL},
  321.         (void *)disppurch,
  322.         NULL, NULL
  323. };
  324.  
  325. static struct Hook fleet_list_destag = {
  326.         {NULL, NULL},
  327.         (void *)destag,
  328.         NULL, NULL
  329. };
  330. static struct Hook fleet_list_contag = {
  331.         {NULL, NULL},
  332.         (void *)constag,
  333.         NULL, NULL
  334. };
  335.  
  336. struct MyData {
  337.    LONG dummy;
  338. };
  339.  
  340. SAVEDS ULONG mAskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg){
  341.         DoSuperMethodA(cl,obj,(Msg *)msg);
  342.         msg->MinMaxInfo->MinWidth  += (GALAXY*30);
  343.         msg->MinMaxInfo->DefWidth  += (GALAXY*30);
  344.         msg->MinMaxInfo->MaxWidth  += (GALAXY*30);
  345.         msg->MinMaxInfo->MinHeight += (GALAXY*30);
  346.         msg->MinMaxInfo->DefHeight += (GALAXY*30);
  347.         msg->MinMaxInfo->MaxHeight += (GALAXY*30);
  348.         return(0);
  349. }
  350. SAVEDS ULONG mDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg){
  351.                        
  352.         LONG n,m;
  353.         struct Sector *nextsector;
  354.         
  355.         DoSuperMethodA(cl,obj,(Msg *)msg);
  356.  
  357.         
  358.         if (!(msg->flags & MADF_DRAWOBJECT)) return(0);
  359.         SetAPen(_rp(obj),_dri(obj)->dri_Pens[TEXTPEN]);
  360.                 
  361.         DrawImage(_rp(obj),&mapbackground,_mleft(obj),_mtop(obj));  
  362.                 
  363.         /* map setup */
  364.         nextsector = firstsector;
  365.         while(nextsector) {
  366.           n        = nextsector->x;
  367.           m        = nextsector->y;
  368.           if (nextsector->planet) {
  369.             if (nextsector->planetowner == FRIENDLYPLANET) DrawImage(_rp(obj),&mapimages1,_mleft(obj)+(n*30),_mtop(obj)+(m*30));
  370.             else if (nextsector->planetowner == NEUTRALPLANET) DrawImage(_rp(obj),&mapimages5,_mleft(obj)+(n*30),_mtop(obj)+(m*30));
  371.             else DrawImage(_rp(obj),&mapimages6,_mleft(obj)+(n*30),_mtop(obj)+(m*30));            
  372.             PrintIText(_rp(obj),&nextsector->text,_mleft(obj)+(n*30),_mtop(obj)+(m*30));
  373.           }
  374.           if (nextsector->friendlyfleet) DrawImage(_rp(obj),&mapimages2,_mleft(obj)+(n*30),_mtop(obj)+(m*30));
  375.           if (nextsector->enemyfleet) DrawImage(_rp(obj),&mapimages3,_mleft(obj)+(n*30),_mtop(obj)+(m*30));
  376.           if (nextsector->item) DrawImage(_rp(obj),&mapimages4,_mleft(obj)+(n*30),_mtop(obj)+(m*30));   
  377.           nextsector = nextsector->next;
  378.         }
  379.         
  380.         return(0);
  381. }
  382.  
  383. SAVEDS ULONG mSetup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  384. {
  385.         if (!(DoSuperMethodA(cl,obj,(Msg *)msg)))
  386.                 return(FALSE);
  387.  
  388.         MUI_RequestIDCMP(obj,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY);
  389.  
  390.         return(TRUE);
  391. }
  392.  
  393.  
  394. SAVEDS ULONG mCleanup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  395. {
  396.         MUI_RejectIDCMP(obj,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY);
  397.         return(DoSuperMethodA(cl,obj,(Msg *)msg));
  398. }
  399.  
  400.  
  401.  
  402. static ULONG mHandleInput(
  403.         struct IClass *cl,
  404.         Object *obj,
  405.         struct MUIP_HandleInput *msg)
  406. {
  407. #define _between(a,x,b) ((x)>=(a) && (x)<=(b))
  408. #define _isinobject(x,y) (_between(_mleft(obj),(x),_mright (obj)) && _between(_mtop(obj) ,(y),_mbottom(obj)))
  409.   int n,m,a,b;
  410.   LONG temp[2];
  411.      
  412.   struct Data *data = INST_DATA(cl,obj);
  413.      
  414.   if (msg->imsg)
  415.      {
  416.      switch (msg->imsg->Class)
  417.        {
  418.        case IDCMP_MOUSEBUTTONS:
  419.          {
  420.          if (msg->imsg->Code==SELECTDOWN)
  421.            {
  422.            if (_isinobject(msg->imsg->MouseX,msg->imsg->MouseY))
  423.              {
  424.              data->x = msg->imsg->MouseX;
  425.              data->y = msg->imsg->MouseY;
  426.              get(sc1,MUIA_Virtgroup_Top,&a);
  427.              get(sc1,MUIA_Virtgroup_Left,&b);
  428.              n = (data->x)+b-16;
  429.              m = (data->y)+a-16;
  430.              if (n > 0) n = n/30;
  431.              if (m > 0) m = m/30;
  432.              
  433.              if ((m <GALAXY && m >= 0) && (n <GALAXY && n >= 0)) {
  434.                temp[0] = n;
  435.                temp[1] = m;
  436.                printf("presend %d,%d\n",n,m);
  437.                senddata (in,out,3*sizeof(LONG), CSDATA,GUI_PLANET,temp);                         
  438.                printf("postsend\n");
  439.              }
  440.            }                           
  441.          }
  442.          else MUI_RejectIDCMP(obj,IDCMP_MOUSEMOVE);
  443.        }
  444.        break;        
  445.     }
  446.     /* passing MUIM_HandleInput to the super class is only necessary
  447.     if you rely on area class input handling (MUIA_InputMode). */
  448.   }
  449.   return(0);
  450. }
  451.  
  452.  
  453. SAVEDS ASM ULONG MyDispatcher(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
  454. {
  455.         switch (msg->MethodID) {
  456.                 case MUIM_AskMinMax: return(mAskMinMax(cl,obj,(APTR)msg));
  457.                 case MUIM_Draw     : return(mDraw     (cl,obj,(APTR)msg));
  458.                 case MUIM_HandleInput: return(mHandleInput(cl,obj,(APTR)msg));
  459.                 case MUIM_Setup      : return(mSetup      (cl,obj,(APTR)msg));
  460.                 case MUIM_Cleanup    : return(mCleanup    (cl,obj,(APTR)msg));
  461.         }
  462.         return(DoSuperMethodA(cl,obj,(Msg *)msg));
  463. }
  464.  
  465.  
  466.  
  467.  
  468. main(int argc, char *argv[]) {
  469.  
  470.   /* mui stuff */
  471.   struct Entity *myentity = NULL,*serverentity = NULL;
  472.   if (!parse(argc)) exit(0);
  473.   init();
  474.   
  475.      
  476.   if (!(SuperClass=MUI_GetClass(MUIC_Area)))
  477.        fail(NULL,"Superclass for the new class not found.");
  478.   /* create the new class */
  479.   if (!(MyClass = MakeClass(NULL,NULL,SuperClass,sizeof(struct MyData),0)))
  480.     {
  481.     MUI_FreeClass(SuperClass);
  482.     fail(NULL,"Failed to create class.");
  483.     }
  484.   /* set the dispatcher for the new class */
  485.   MyClass->cl_Dispatcher.h_Entry    = (APTR)MyDispatcher;
  486.   MyClass->cl_Dispatcher.h_SubEntry = NULL;
  487.   MyClass->cl_Dispatcher.h_Data     = NULL;
  488.   
  489.  
  490.   app = ApplicationObject,
  491.      MUIA_Application_Title,          "MUIEmpire",
  492.      MUIA_Application_Version,        VERSTAG,
  493.      MUIA_Application_Copyright,      "© 1995, by Karl Bellve",
  494.      MUIA_Application_Author,         "Karl Bellve",
  495.      MUIA_Application_Description,    "The unlimited player, unlimited planet, unlimited ship type conquest game",
  496.      MUIA_Application_HelpFile,       "MUIEmpire.guide",
  497.      MUIA_Application_Base,           "EMPIRE",
  498.       SubWindow, WI_Fleet = WindowObject,
  499.         MUIA_Window_Title, "Empire Fleet Window",
  500.         MUIA_Window_ID, MAKE_ID('F','L','E','E'),
  501.          WindowContents, VGroup,
  502.              Child, VGroup,
  503.                    Child, lv6 = ListviewObject, MUIA_Listview_Input, TRUE, MUIA_Listview_MultiSelect, MUIV_Listview_MultiSelect_Default, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  504.                      MUIA_List_Format,"COL=0 MINWIDTH=2,COL=1 MINWIDTH=2,COL=2 MINWIDTH=20,COL=4 MINWIDTH=8,COL=5 MINWIDTH=8,COL=6 MINWIDTH=8,COL=7 MINWIDTH=8,COL=8 MINWIDTH=8,COL=9 MINWIDTH=8,COL=10 MINWIDTH=5,COL=11 MINWIDTH=5, COL=12 MINWIDTH=20",
  505.                      MUIA_List_ConstructHook,&fleet_list_conhook,
  506.                      MUIA_List_DestructHook,&fleet_list_deshook,
  507.                      MUIA_List_DisplayHook,&fleet_list_dsphook,End,
  508.                    End,
  509.                    Child, BT_JoinFleet = KeyButton("Join Fleets",'j'),
  510.                  End,
  511.              End,
  512.          End,
  513.          
  514.       SubWindow, WI_Sector = WindowObject,
  515.         MUIA_Window_Title, "Sector Information",
  516.         MUIA_Window_ID, MAKE_ID('S','E','C','T'),
  517.          WindowContents, VGroup,
  518.              Child, HGroup,
  519.               Child, VGroup, MUIA_Weight, 200,                                
  520.                Child, ColGroup (2), 
  521.                   Child, Label("X coor:"),
  522.                   Child, sl41 = SliderObject, MUIA_Slider_Min, 0, MUIA_Slider_Max, 99999, MUIA_Slider_Level, 0, End,
  523.                   Child, Label("Y coor:"),
  524.                   Child, sl42 = SliderObject, MUIA_Slider_Min, 0, MUIA_Slider_Max, 99999, MUIA_Slider_Level, 0, End,
  525.                 End,
  526.                 Child, lv16 = ListviewObject, MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  527.                    MUIA_List_Format,"COL=2 MINWIDTH=30,COL=3 MINWIDTH=30,COL=4 MINWIDTH=20,COL=5 MINWIDTH=20",
  528.                    MUIA_List_ConstructHook,&fleet_list_conhook,
  529.                    MUIA_List_DestructHook,&fleet_list_deshook,
  530.                    MUIA_List_DisplayHook,&fleet_list_dsphook,End,
  531.                End,
  532.                End,
  533.                Child, lv17=ListviewObject, MUIA_Weight, 50,MUIA_Listview_Input, FALSE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  534.                   MUIA_List_Format,"P=/33c MINWIDTH=30,MINWIDTH=70",
  535.                   MUIA_List_ConstructHook,&fleet_list_contag,
  536.                   MUIA_List_DestructHook,&fleet_list_destag,
  537.                   MUIA_List_DisplayHook,&fleet_list_dsptag,
  538.                   End,
  539.                End,              
  540.              End, 
  541.              
  542.              End,
  543.          End,   
  544.  
  545.    SubWindow, WI_Message = WindowObject,
  546.      MUIA_Window_Title, "Empire Message Window",
  547.      MUIA_Window_ID, MAKE_ID('M','E','S','S'),
  548.      WindowContents, HGroup,
  549.              Child, HGroup,                                   
  550.                Child, VGroup, MUIA_Weight, 0,
  551.                  Child, ColGroup(2), GroupFrameT("Player"),  
  552.                    Child, Label("Name:"      ),
  553.                    Child, tx13 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, NULL, End,
  554.                    Child, Label("Empire:"      ),
  555.                    Child, str5 = StringObject, StringFrame, MUIA_String_MaxLen,20,End,
  556.                    Child, Label("Turn:"),
  557.                    Child, tx22 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, NULL, End,                             
  558.                  End, 
  559.                  Child, HGroup,
  560.                    Child, BT_SendMessage = KeyButton("Send Message",'m'),                     
  561.                    Child, BT_ClearMessage = KeyButton("Clear Messages",'c'),                     
  562.                  End, 
  563.                  Child, str7 = StringObject, StringFrame, MUIA_String_MaxLen,100,End,
  564.                  Child, lv18 = ListviewObject,MUIA_Listview_MultiSelect, 
  565.                     MUIV_Listview_MultiSelect_Default, 
  566.                     MUIA_List_Title, "Enemy Empires",InputListFrame,                    
  567.                     MUIA_Listview_Input, TRUE, MUIA_Listview_List, 
  568.                     ListObject,
  569.                     MUIA_List_Format,"COL 1",
  570.                     MUIA_List_ConstructHook,&fleet_list_contag,
  571.                     MUIA_List_DestructHook,&fleet_list_destag,
  572.                     MUIA_List_DisplayHook,&fleet_list_dsptag,
  573.                   End,
  574.                  End,
  575.                End,
  576.                Child, lv15 = ListviewObject, MUIA_Weight, 150,MUIA_Listview_Input, FALSE, MUIA_Listview_List, ListObject, MUIA_List_Title, "Game Messages",InputListFrame, 
  577.                  MUIA_List_ConstructHook,MUIV_List_ConstructHook_String,
  578.                  MUIA_List_DestructHook,MUIV_List_DestructHook_String,End,
  579.  
  580.                End,    
  581.              End,
  582.           End,
  583.      End, 
  584.      
  585.      SubWindow, WI_Mainwindow = WindowObject,
  586.         MUIA_Window_Title, "Empire Control Window",
  587.         MUIA_Window_ID, MAKE_ID('C','O','N','T'),
  588.         MUIA_Window_Menustrip, strip = MUI_MakeObject(MUIO_MenustripNM,MenuData1,0),
  589.         WindowContents, HGroup,
  590.               Child, HGroup,
  591.                  Child, HGroup, 
  592.                     Child, sc1 = ScrollgroupObject, MUIA_HorizWeight, 200,MUIA_Scrollgroup_Contents, vi1 = VGroupV, VirtualFrame,           
  593.                        Child, MyObj = NewObject(MyClass,NULL,
  594.                                         MUIA_Background, MUII_BACKGROUND,
  595.                                         TAG_DONE), 
  596.                     End,
  597.                  End,                                                              
  598.                  Child, VGroup, MUIA_HorizWeight, 25,
  599.                     Child, VSpace(0),
  600.                     Child, VGroup, GroupFrameT("Current Planet"),
  601.                       Child, HGroup,
  602.                           Child, BT_LastPlanet = KeyButton("Last",'l'),
  603.                           Child, BT_NextPlanet = KeyButton("Next",'n'), 
  604.                        End,
  605.                        Child, ColGroup(2),
  606.                           Child, Label("Name:"      ),
  607.                           Child, str3 = StringObject, StringFrame, MUIA_String_MaxLen,20,End,
  608.                           Child, Label("Empire:"     ),
  609.                           Child, tx2 = TextObject,MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "0", End,
  610.                           Child, Label("Population:"),  
  611.                           Child, tx3 = TextObject,MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "0", End,
  612.                           Child, Label("Technology:"),
  613.                           Child, tx4 = TextObject,MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "0", End,
  614.                           Child, Label("Fuel:"),
  615.                           Child, tx5 = TextObject,MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "0", End,
  616.                           Child, Label("Production:"),
  617.                           Child, tx35 = TextObject,MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "None", End,
  618.                           Child, Label("Tax Rate:"  ),
  619.                           Child, sl32 = SliderObject, MUIA_Slider_Min, 0, MUIA_Slider_Max, 100, MUIA_Slider_Level, 10, End,
  620.                        End,
  621.                     End,
  622.                     Child, ColGroup(2),
  623.                        Child, BT_Purchase = KeyButton("Purchasing",'p'),
  624.                        Child, BT_Movement = KeyButton("Fleet Control",  'f'), 
  625.                        Child, BT_PlanetCargo = KeyButton("Inventory",'i'), 
  626.                        Child, BT_NextPlayer = SimpleButton("Done"), 
  627.                     End,
  628.                     Child, VSpace(0),
  629.                     End,
  630.                  End,
  631.           End,
  632.         End,         
  633.      End,
  634.     SubWindow, WI_Login = WindowObject,
  635.         MUIA_Window_Title, "Empire Login",
  636.         MUIA_Window_ID, MAKE_ID('L','O','G','N'),
  637.         WindowContents, VGroup,
  638.               Child, VGroup,
  639.               Child, ColGroup (2), GroupFrame,
  640.                 Child, Label("Name:"),
  641.                 Child, str13 = StringObject, StringFrame, MUIA_String_MaxLen, 30,End,             
  642.                 Child, Label("Password:"),
  643.                 Child, str14 = StringObject, StringFrame, MUIA_String_Secret,MUIA_String_MaxLen, 30,End,             
  644.                 Child, Label("Game:"),
  645.                 Child, str15 = StringObject, StringFrame, MUIA_String_MaxLen, 30,End,                        
  646.               End,
  647.               Child, BT_PlayGame = KeyButton("Play Game",'p'),
  648.             End,   
  649.           End,         
  650.         End,
  651.  
  652.     SubWindow, WI_Gauge = WindowObject,
  653.         MUIA_Window_Title, "Computer is thinking ...",
  654.         MUIA_Window_ID, MAKE_ID('C','I','T','H'),
  655.         WindowContents, VGroup, GroupSpacing(1),
  656.             Child, gauge1 = GaugeObject, GaugeFrame, MUIA_FixWidth, 250, MUIA_Gauge_Horiz,TRUE, MUIA_Gauge_InfoText,"    ",End,
  657.             Child, ScaleObject, End,
  658.           End,         
  659.         End,
  660.  
  661.      SubWindow, WI_Movement = WindowObject,
  662.         MUIA_Window_Title, "Ship Movement",
  663.         MUIA_Window_ID, MAKE_ID('M','O','V','E'),
  664.         WindowContents, VGroup,
  665.          Child, HGroup,
  666.             Child, VGroup,
  667.               Child, ColGroup (2),
  668.                 Child, Label("From Sector:"),
  669.                 Child, tx25 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "                               ", End,             
  670.                 Child, Label("To Sector:"),
  671.                 Child, tx26 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "                               ", End,             
  672.                 Child, Label("Distance:"),
  673.                 Child, tx27 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "0", End,             
  674.                 Child, Label("Fuel Required:"),
  675.                 Child, tx28 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "0", End,             
  676.               End,
  677.               Child, VGroup, GroupFrameT("Current Fleet"),
  678.                 Child, BT_Showships = TextObject, MUIA_Text_PreParse, "\33c",MUIA_Frame, MUIV_Frame_Button, MUIA_InputMode, MUIV_InputMode_Toggle,MUIA_Text_Contents, "Show Ships", End,             
  679.                 Child, lv12 = ListviewObject, MUIA_Listview_MultiSelect, MUIV_Listview_MultiSelect_Default,MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  680.                     MUIA_List_Format,"COL=1",
  681.                     MUIA_List_ConstructHook,&fleet_list_contag,
  682.                     MUIA_List_DestructHook,&fleet_list_destag,
  683.                     MUIA_List_DisplayHook,&fleet_list_dsptag,  
  684.                 End,
  685.               End,
  686.             End, 
  687.           End,
  688.           Child, VGroup,
  689.             Child, pcy2 = Cycle(pages2),
  690.             Child, pgr2 = PageGroup,
  691.               Child, VGroup, GroupFrame,
  692.                 Child, ColGroup (2), GroupFrameT("To Sector"),
  693.                   Child, Label("X coor:"),
  694.                   Child, sl17 = SliderObject, MUIA_Slider_Min, 0, MUIA_Slider_Max, 9999, MUIA_Slider_Level, 0, End,
  695.                   Child, Label("Y coor:"),
  696.                   Child, sl18 = SliderObject, MUIA_Slider_Min, 0, MUIA_Slider_Max, 9999, MUIA_Slider_Level, 0, End,
  697.                 End,
  698.                 Child, lv3 = ListviewObject, MUIA_Frame,MUIV_Frame_InputList, MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, InputListFrame, 
  699.                  MUIA_List_ConstructHook,MUIV_List_ConstructHook_String,
  700.                  MUIA_List_DestructHook,MUIV_List_DestructHook_String, End,             
  701.                 End,
  702.                 Child, BT_PlotCourse = SimpleButton("Plot Course"),
  703.               End,
  704.             Child, VGroup, GroupFrame,
  705.                 Child, ColGroup (2),
  706.                   Child, tx33 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "Here:", End,             
  707.                   Child, pop1 = PoplistObject,MUIA_Popstring_String, str11 = String(0,30), MUIA_Popstring_Button, PopButton(MUII_PopUp),MUIA_Poplist_Array,popitem, End,
  708.                   Child, Label("Limit:"),
  709.                   Child, str9 = StringObject, StringFrame, MUIA_String_Accept,"0123456789",MUIA_String_Integer, 1000,MUIA_String_MaxLen,10,End,          
  710.                 End,
  711.                 Child, ColGroup (2), GroupFrame, 
  712.                   Child, tx34 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "There:", End,             
  713.                   Child, pop2 = PoplistObject,MUIA_Popstring_String, str12 = String(0,30), MUIA_Popstring_Button, PopButton(MUII_PopUp),MUIA_Poplist_Array,popitem, End,                 
  714.                   Child, Label("Limit:"),
  715.                   Child, str10 = StringObject, StringFrame, MUIA_String_Accept,"0123456789",MUIA_String_Integer, 1000,MUIA_String_MaxLen,10,End,          
  716.                 End,
  717.                 Child, HGroup, MUIA_Group_SameSize, TRUE,
  718.                   Child, BT_ApplyTrade   = KeyButton("Apply Orders" ,'A'),
  719.                   Child, BT_CancelTrade  = KeyButton("Cancel Orders",'C'),
  720.                 End,
  721.               End,
  722.             End,    
  723.           End,
  724.       End,
  725.       Child, HGroup,
  726.         Child, BT_LastForce   = KeyButton("Last Force"  ,'l'),
  727.         Child, BT_NextForce   = KeyButton("Next Force"  ,'n'), 
  728.         Child, BT_FleetCargo  = KeyButton("Freight"     ,'r'),
  729.         Child, BT_AutoFuel    = KeyButton("Fuel Fleet"  ,'g'), 
  730.         Child, BT_ClearCourse = KeyButton("Clear Course",'c'), 
  731.         Child, BT_SendPartial = KeyButton("New Fleet"   ,'f'),
  732.         Child, BT_Sellship    = KeyButton("Sell Ship"   ,'s'),
  733.         
  734.         End,
  735.      End,
  736.      End,
  737.      SubWindow, WI_PlanetCargo = WindowObject,
  738.         MUIA_Window_Title, "Cargo Operations",
  739.         MUIA_Window_ID, MAKE_ID('P','L','C','A'),
  740.         WindowContents, VGroup,           
  741.               Child, reg2 = RegisterGroup(pages4), 
  742.                  Child, VGroup,
  743.                    Child, VGroup,
  744.                      Child, lv8 = ListviewObject, MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  745.                          MUIA_List_Format,"P=/33c MINWIDTH=30,MINWIDTH=70",
  746.                          MUIA_List_ConstructHook,&fleet_list_contag,
  747.                          MUIA_List_DestructHook,&fleet_list_destag,
  748.                          MUIA_List_DisplayHook,&fleet_list_dsptag,
  749.                      End,
  750.                    End,
  751.                    Child, VGroup,
  752.                      Child, BT_PlanetTransferSec = KeyButton("Transfer to Sector",'t'),
  753.                      Child, BT_SellGoods         = KeyButton("Convert to Credits",'c'),
  754.                      Child, Hypergroup = VGroup, GroupFrame,
  755.                        Child, BT_Hyper = KeyButton("Hyper Transfer",'h'),                     
  756.                        Child, ColGroup (2), GroupFrameT("To Sector"),
  757.                        Child, Label("X coor:"),
  758.                        Child, sl43 = SliderObject, MUIA_Slider_Min, 0, MUIA_Slider_Max, 99999, MUIA_Slider_Level, 0, End,
  759.                        Child, Label("Y coor:"),
  760.                        Child, sl44 = SliderObject, MUIA_Slider_Min, 0, MUIA_Slider_Max, 99999, MUIA_Slider_Level, 0, End,
  761.                        End,
  762.                      End,
  763.                    End,
  764.                  End,  
  765.                  End,
  766.                  Child, VGroup,
  767.                    Child, VGroup,
  768.                      Child, lv7 = ListviewObject, MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  769.                          MUIA_List_Format,"P=/33c MINWIDTH=30,MINWIDTH=70",
  770.                          MUIA_List_ConstructHook,&fleet_list_contag,
  771.                          MUIA_List_DestructHook,&fleet_list_destag,
  772.                          MUIA_List_DisplayHook,&fleet_list_dsptag,
  773.                      End,
  774.                    End,
  775.                    Child, VGroup, 
  776.                      Child, BT_SectorTransferPla = KeyButton("Transfer to Planet",'t'), 
  777.                    End,               
  778.                  End,    
  779.                 End,    
  780.               End,
  781.  
  782.             Child, ColGroup(2), GroupFrame,            
  783.                 Child, Label("Quantity:"),
  784.                 Child, sl33 = SliderObject,  MUIA_Slider_Min, 0, MUIA_Slider_Max, 99999, End,
  785.               End,
  786.           End,
  787.         End,
  788.      SubWindow, WI_FleetCargo = WindowObject,
  789.         MUIA_Window_Title, "Cargo Operations",
  790.         MUIA_Window_ID, MAKE_ID('F','L','C','A'),
  791.         WindowContents, VGroup,           
  792.               Child, reg2 = RegisterGroup(pages5),    
  793.                  Child, VGroup,
  794.                    Child, VGroup,
  795.                      Child, lv9 = ListviewObject, MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  796.                          MUIA_List_Format,"P=/33c MINWIDTH=30,MINWIDTH=70",
  797.                          MUIA_List_ConstructHook,&fleet_list_contag,
  798.                          MUIA_List_DestructHook,&fleet_list_destag,
  799.                          MUIA_List_DisplayHook,&fleet_list_dsptag,
  800.                      End,
  801.                    End,
  802.                    Child, HGroup, 
  803.                      Child, BT_SectorTransferFle = KeyButton("Transfer to Fleet",'t'),
  804.                   End,
  805.                  End,  
  806.                  End,    
  807.                  Child, VGroup,
  808.                    Child, VGroup,
  809.                      Child, lv10 = ListviewObject, MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  810.                          MUIA_List_Format,"P=/33c MINWIDTH=30,MINWIDTH=70",
  811.                          MUIA_List_ConstructHook,&fleet_list_contag,
  812.                          MUIA_List_DestructHook,&fleet_list_destag,
  813.                          MUIA_List_DisplayHook,&fleet_list_dsptag,
  814.                      End,
  815.                    End,
  816.                    Child, HGroup, 
  817.                      Child, BT_FleetTransferSec = KeyButton("Transfer to Sector",'t'),
  818.                    End,
  819.                  End,
  820.               End,
  821.  
  822.             End,
  823.             Child, ColGroup(2), GroupFrame,            
  824.                 Child, Label("Quantity:"),
  825.                 Child, sl34 = SliderObject,  MUIA_Slider_Min, 0, MUIA_Slider_Max, 99999, End,
  826.               End,
  827.           End,
  828.         End,   
  829.      SubWindow, WI_Configuration = WindowObject,
  830.         MUIA_Window_Title, "Configuration",
  831.         MUIA_Window_ID, MAKE_ID('C','O','N','F'),
  832.         WindowContents, VGroup,
  833.            Child, ColGroup(2),
  834.              Child, Label("Planets:"),
  835.              Child, str6 = StringObject, StringFrame, MUIA_String_Accept,"0123456789",MUIA_String_Integer, 40,MUIA_String_MaxLen,10,End,          
  836.            End,
  837.            Child, VGroup, GroupFrameT("Players"),
  838.              Child, HSpace(0),
  839.              Child, lv2 = ListviewObject,MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, InputListFrame, 
  840.                  MUIA_List_ConstructHook,MUIV_List_ConstructHook_String,
  841.                  MUIA_List_DestructHook,MUIV_List_DestructHook_String,
  842.                End,
  843.              End,
  844.              Child, ColGroup(2), 
  845.                Child, Label2("Name:"),
  846.                Child, str1 = StringObject, StringFrame, MUIA_String_MaxLen,20,End,
  847.              End,
  848.              Child, VSpace(0),
  849.              Child, BT_AddPlayer    = KeyButton("Add Player",'a'),
  850.              Child, BT_RemovePlayer = KeyButton("Remove Player",'r'),
  851.              Child, BT_LoadGame     = KeyButton("Load Game",'l'),
  852.              Child, VSpace(0),
  853.            End,
  854.            Child, VSpace(0),
  855.            Child, HGroup, MUIA_Group_SameSize, TRUE,
  856.              Child, BT_Done   = KeyButton("Done",'d'),
  857.              Child, HSpace(0),
  858.              Child, BT_Cancel = KeyButton("Cancel",'>'),
  859.            End,
  860.            Child, VSpace(0),
  861.         End,
  862.         End,
  863.      SubWindow, WI_Purchase = WindowObject,
  864.         MUIA_Window_Title, "Purchasing",
  865.         MUIA_Window_ID, MAKE_ID('P','U','R','C'),
  866.         WindowContents, HGroup,
  867.             Child, VGroup,GroupFrame, MUIA_Weight, 150,
  868.               Child, lv11 = ListviewObject,MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  869.                          MUIA_List_Format,",,,,,,",
  870.                          MUIA_List_ConstructHook,&ship_list_conhook,
  871.                          MUIA_List_DestructHook,&ship_list_deshook,
  872.                          MUIA_List_DisplayHook,&ship_list_dsphook,
  873.                  End,
  874.               End,
  875.               Child, ColGroup(2), GroupFrame,            
  876.                    Child, Label("Name:"      ),
  877.                    Child, str8 = StringObject, StringFrame, MUIA_String_MaxLen,30,End,                           
  878.                    Child, Label("Quantity:"),
  879.                    Child, sl35 = SliderObject,  MUIA_Slider_Min, 0, MUIA_Slider_Max, 99999, End,
  880.               End,  
  881.               Child, HGroup,  
  882.                 Child, BT_PurchaseShip    = KeyButton("Purchase Ship",'s'),
  883.                 Child, BT_ShipDesign      = KeyButton("Design Ship",'d'),
  884.                 Child, BT_SetProduction   = KeyButton("Production",'r'),
  885.                 Child, BT_ClearProduction = KeyButton("Clear Production",'c'),
  886.               End,
  887.             End,
  888.             Child, VGroup,GroupFrame, MUIA_Weight, 75, 
  889.               Child, lv4 = ListviewObject, MUIA_Listview_Input, TRUE, MUIA_Listview_List, ListObject, MUIA_List_Title, TRUE,InputListFrame,
  890.                          MUIA_List_Format,"MINWIDTH=30,MINWIDTH=70",
  891.                          MUIA_List_ConstructHook,&fleet_list_contag,
  892.                          MUIA_List_DestructHook,&fleet_list_destag,
  893.                          MUIA_List_DisplayHook,&fleet_list_dsppurch,
  894.               End,
  895.               End,
  896.               Child, ColGroup(2), GroupFrame,            
  897.                  Child, Label("Quantity:"),
  898.                  Child, sl1 = SliderObject,  MUIA_Slider_Min, 0, MUIA_Slider_Max, 99999, End,
  899.               End,
  900.               Child, HGroup, MUIA_Group_SameSize, TRUE,
  901.                 Child, BT_MakePurchase = KeyButton("Purchase Item",'p'),
  902.               End,
  903.             End,        
  904.         End,     
  905.      End,
  906.    SubWindow, WI_ShipDesign = WindowObject,
  907.         MUIA_Window_Title, "Ship Design",
  908.         MUIA_Window_ID, MAKE_ID('S','H','I','P'),
  909.         WindowContents, VGroup,
  910.             Child, ColGroup(2), GroupFrame,            
  911.                  Child, Label2("Ship Class:"),
  912.                  Child, str4 = StringObject, StringFrame, MUIA_String_MaxLen,20,MUIA_String_Contents, "New Ship Class",End,
  913.                  Child, Label("Offense:"),
  914.                  Child, sl36 = SliderObject,  MUIA_Slider_Min, 1, MUIA_Slider_Max, 100, End,
  915.                  Child, Label("Defense:"),
  916.                  Child, sl37 = SliderObject,  MUIA_Slider_Min, 1, MUIA_Slider_Max, 100, End,
  917.                  Child, Label("Cargo:"),
  918.                  Child, sl40 = SliderObject,  MUIA_Slider_Min, 1, MUIA_Slider_Max, 100, End,
  919.                  Child, Label("Speed:"),
  920.                  Child, sl38 = SliderObject,  MUIA_Slider_Min, 1, MUIA_Slider_Max, 10, End,
  921.                  Child, Label("Fuel/Sector:"),
  922.                  Child, sl39 = SliderObject,  MUIA_Slider_Min, 1, MUIA_Slider_Max, 10, End,
  923.                  Child, Label ("Production Cost:"),
  924.                  Child, tx29 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "0", End,             
  925.                  Child, Label ("Design Cost:"),
  926.                  Child, tx30 = TextObject, MUIA_Text_PreParse, "\33c", MUIA_Text_Contents, "0", End,             
  927.             End,       
  928.             Child, BT_PurchaseDesign = KeyButton("Purchase Design",'d'),
  929.           End,
  930.         
  931.       End,     
  932.    End;     
  933.  
  934.    
  935.  
  936.   /* load save settings */
  937.   DoMethod(app,MUIM_Application_Load,MUIV_Application_Load_ENVARC);
  938.   
  939.    
  940.   DoMethod(BT_Purchase      ,MUIM_Notify,MUIA_Pressed,FALSE,WI_Purchase,3,MUIM_Set,MUIA_Window_Open,TRUE);
  941.   DoMethod(BT_FleetCargo    ,MUIM_Notify,MUIA_Pressed,FALSE,WI_FleetCargo,3,MUIM_Set,MUIA_Window_Open,TRUE);
  942.   DoMethod(BT_PlanetCargo   ,MUIM_Notify,MUIA_Pressed,FALSE,WI_PlanetCargo,3,MUIM_Set,MUIA_Window_Open,TRUE);
  943.   DoMethod(BT_Map           ,MUIM_Notify,MUIA_Pressed,FALSE,WI_Map     ,3,MUIM_Set,MUIA_Window_Open,TRUE);
  944.   DoMethod(BT_Movement      ,MUIM_Notify,MUIA_Pressed,FALSE,WI_Movement,3,MUIM_Set,MUIA_Window_Open,TRUE);
  945.   DoMethod(BT_ShipDesign    ,MUIM_Notify,MUIA_Pressed,FALSE,WI_ShipDesign,3,MUIM_Set,MUIA_Window_Open,TRUE);
  946.   DoMethod(WI_Movement      ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_Movement   ,3,MUIM_Set,MUIA_Window_Open,FALSE);
  947.   DoMethod(WI_PlanetCargo   ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_PlanetCargo ,3,MUIM_Set,MUIA_Window_Open,FALSE);
  948.   DoMethod(WI_FleetCargo    ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_FleetCargo ,3,MUIM_Set,MUIA_Window_Open,FALSE);
  949.   DoMethod(WI_Purchase      ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_Purchase,3,MUIM_Set,MUIA_Window_Open,FALSE);
  950.   DoMethod(WI_Map           ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_Map,3,MUIM_Set,MUIA_Window_Open,FALSE);
  951.   DoMethod(WI_Configuration ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_Map,3,MUIM_Set,MUIA_Window_Open,FALSE);
  952.   DoMethod(WI_ShipDesign    ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_ShipDesign,3,MUIM_Set,MUIA_Window_Open,FALSE);
  953.   DoMethod(WI_Login         ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_ShipDesign,3,MUIM_Set,MUIA_Window_Open,FALSE);
  954.   DoMethod(BT_LoadGame      ,MUIM_Notify,MUIA_Pressed,FALSE,WI_Configuration,3,MUIM_Set,MUIA_Window_Open,FALSE);
  955.   DoMethod(BT_PlayGame      ,MUIM_Notify,MUIA_Pressed,FALSE,WI_Login,3,MUIM_Set,MUIA_Window_Open,FALSE);
  956.   DoMethod(WI_Fleet         ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_Fleet,3,MUIM_Set,MUIA_Window_Open,FALSE);
  957.   DoMethod(WI_Sector        ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_Sector,3,MUIM_Set,MUIA_Window_Open,FALSE);
  958.   DoMethod(WI_Message       ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,WI_Message,3,MUIM_Set,MUIA_Window_Open,FALSE);
  959.   
  960.  
  961.  
  962.   DoMethod(WI_Mainwindow,MUIM_Notify,MUIA_Window_CloseRequest,
  963.     TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  964.   DoMethod(BT_Quit,MUIM_Notify,MUIA_Pressed,
  965.     FALSE,app,2,MUIM_Application_ReturnID,ID_QUIT);
  966.   DoMethod(WI_Configuration,MUIM_Notify,MUIA_Window_CloseRequest,
  967.     TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  968.   DoMethod(WI_Login,MUIM_Notify,MUIA_Window_CloseRequest,
  969.     TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  970.   DoMethod(BT_Cancel,MUIM_Notify,MUIA_Pressed,
  971.     FALSE,app,2,MUIM_Application_ReturnID,ID_CANCEL);
  972.   DoMethod(BT_SendPartial,MUIM_Notify,MUIA_Pressed,
  973.     FALSE,app,2,MUIM_Application_ReturnID,ID_SENDPARTIAL); 
  974.   DoMethod(BT_PlayGame,MUIM_Notify,MUIA_Pressed,
  975.     FALSE,app,2,MUIM_Application_ReturnID,ID_PLAYGAME);  
  976.   
  977.   
  978.   DoMethod(BT_ClearCourse,MUIM_Notify,MUIA_Pressed,
  979.     FALSE,app,2,MUIM_Application_ReturnID,ID_CLEARCOURSE);
  980.   
  981.   DoMethod(BT_Hyper,MUIM_Notify,MUIA_Pressed,
  982.     FALSE,app,2,MUIM_Application_ReturnID,ID_HYPER);  
  983.  
  984.   DoMethod(BT_LoadGame,MUIM_Notify,MUIA_Pressed,
  985.     FALSE,app,2,MUIM_Application_ReturnID,MEN_LOADGAME); 
  986.   DoMethod(BT_AutoFuel,MUIM_Notify,MUIA_Pressed,
  987.     FALSE,app,2,MUIM_Application_ReturnID,ID_AUTOFUEL); 
  988.  
  989.   DoMethod(BT_SendMessage,MUIM_Notify,MUIA_Pressed,
  990.     FALSE,app,2,MUIM_Application_ReturnID,ID_SENDMESSAGE);
  991.   DoMethod(BT_ClearMessage,MUIM_Notify,MUIA_Pressed,
  992.     FALSE,app,2,MUIM_Application_ReturnID,ID_CLEARMESSAGE);
  993.   DoMethod(str3,MUIM_Notify,MUIA_String_Acknowledge,
  994.     MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_NEWNAME);
  995.   DoMethod(str5,MUIM_Notify,MUIA_String_Acknowledge,
  996.     MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_NEWNAME);
  997.   DoMethod(str8,MUIM_Notify,MUIA_String_Acknowledge,
  998.     MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_SHIPNAME);
  999.     
  1000.   DoMethod(BT_ApplyTrade,MUIM_Notify,MUIA_Pressed,
  1001.     FALSE,app,2,MUIM_Application_ReturnID,ID_APPLYTRADE);
  1002.   
  1003.   DoMethod(BT_CancelTrade,MUIM_Notify,MUIA_Pressed,
  1004.     FALSE,app,2,MUIM_Application_ReturnID,ID_CANCELTRADE);
  1005.  
  1006.  
  1007.   DoMethod(sl32,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1008.    app,2,MUIM_Application_ReturnID,ID_NEWTAX);
  1009.   DoMethod(BT_PlanetTransferSec,MUIM_Notify,MUIA_Pressed,
  1010.     FALSE,app,2,MUIM_Application_ReturnID,ID_PLANETTRANSFERSEC);
  1011.   DoMethod(BT_SectorTransferPla,MUIM_Notify,MUIA_Pressed,
  1012.     FALSE,app,2,MUIM_Application_ReturnID,ID_SECTORTRANSFERPLA);  
  1013.   DoMethod(BT_FleetTransferSec,MUIM_Notify,MUIA_Pressed,
  1014.     FALSE,app,2,MUIM_Application_ReturnID,ID_FLEETTRANSFERSEC);
  1015.   DoMethod(BT_PurchaseDesign,MUIM_Notify,MUIA_Pressed,
  1016.     FALSE,app,2,MUIM_Application_ReturnID,ID_PURCHASEDESIGN);
  1017.   DoMethod(BT_PurchaseShip,MUIM_Notify,MUIA_Pressed,
  1018.     FALSE,app,2,MUIM_Application_ReturnID,ID_PURCHASESHIP); 
  1019.   DoMethod(BT_SellGoods,MUIM_Notify,MUIA_Pressed,
  1020.     FALSE,app,2,MUIM_Application_ReturnID,ID_SELLGOODS);  
  1021.   DoMethod(BT_JoinFleet,MUIM_Notify,MUIA_Pressed,
  1022.     FALSE,app,2,MUIM_Application_ReturnID,ID_JOINFLEET);    
  1023.   
  1024.   DoMethod(BT_Sellship,MUIM_Notify,MUIA_Pressed,
  1025.     FALSE,app,2,MUIM_Application_ReturnID,ID_SELLSHIP); 
  1026.   
  1027.   DoMethod(BT_Showships,MUIM_Notify,MUIA_Selected,
  1028.     FALSE,lv12,3,MUIM_Set, MUIA_ShowMe, FALSE); 
  1029.     
  1030.   DoMethod(BT_Showships,MUIM_Notify,MUIA_Selected,
  1031.     TRUE,lv12,3,MUIM_Set, MUIA_ShowMe, TRUE);   
  1032.   DoMethod(BT_Showships,MUIM_Notify,MUIA_Pressed,
  1033.     FALSE,lv12,3,MUIM_Set, MUIA_ShowMe, FALSE); 
  1034.   DoMethod(BT_Showships,MUIM_Notify,MUIA_Selected,
  1035.     TRUE,BT_Sellship,3,MUIM_Set, MUIA_Disabled, FALSE);  
  1036.   DoMethod(BT_Showships,MUIM_Notify,MUIA_Selected,
  1037.     TRUE,BT_SendPartial,3,MUIM_Set, MUIA_Disabled, FALSE);  
  1038.     
  1039.   DoMethod(BT_Showships,MUIM_Notify,MUIA_Selected,
  1040.     FALSE,BT_Sellship,3,MUIM_Set, MUIA_Disabled, TRUE);  
  1041.   DoMethod(BT_Showships,MUIM_Notify,MUIA_Selected,
  1042.     FALSE,BT_SendPartial,3,MUIM_Set, MUIA_Disabled, TRUE); 
  1043.  
  1044.     
  1045.   DoMethod(BT_SectorTransferFle,MUIM_Notify,MUIA_Pressed,
  1046.     FALSE,app,2,MUIM_Application_ReturnID,ID_SECTORTRANSFERFLE);
  1047.   DoMethod(BT_MakePurchase,MUIM_Notify,MUIA_Pressed,
  1048.     FALSE,app,2,MUIM_Application_ReturnID,ID_PURCHASE);
  1049.   DoMethod(BT_PlotCourse,MUIM_Notify,MUIA_Pressed,
  1050.     FALSE,app,2,MUIM_Application_ReturnID,ID_PLOTCOURSE);
  1051.   DoMethod(BT_Done,MUIM_Notify,MUIA_Pressed,
  1052.     FALSE,app,2,MUIM_Application_ReturnID,ID_DONE);
  1053.   DoMethod(BT_NextForce,MUIM_Notify,MUIA_Pressed,
  1054.     FALSE,app,2,MUIM_Application_ReturnID,ID_NEXTFORCE);
  1055.   DoMethod(BT_LastForce,MUIM_Notify,MUIA_Pressed,
  1056.     FALSE,app,2,MUIM_Application_ReturnID,ID_LASTFORCE);
  1057.   DoMethod(BT_NextPlayer,MUIM_Notify,MUIA_Pressed,
  1058.     FALSE,app,2,MUIM_Application_ReturnID,ID_NEXTPLAYER);
  1059.   DoMethod(BT_LastPlayer,MUIM_Notify,MUIA_Pressed,
  1060.     FALSE,app,2,MUIM_Application_ReturnID,ID_LASTPLAYER);
  1061.   DoMethod(str1,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,
  1062.     app,2,MUIM_Application_ReturnID,ID_ADDPLAYER);
  1063.   DoMethod(lv2,MUIM_Notify,MUIA_Listview_DoubleClick,MUIV_EveryTime,
  1064.     app,2,MUIM_Application_ReturnID,ID_SETSTRING);
  1065.   DoMethod(BT_NextPlanet,MUIM_Notify,MUIA_Pressed,
  1066.     FALSE,app,2,MUIM_Application_ReturnID,ID_NEXTPLANET);
  1067.   DoMethod(BT_LastPlanet,MUIM_Notify,MUIA_Pressed,
  1068.     FALSE,app,2,MUIM_Application_ReturnID,ID_LASTPLANET);
  1069.   DoMethod(BT_Movement,MUIM_Notify,MUIA_Pressed,
  1070.     FALSE,app,2,MUIM_Application_ReturnID,ID_MOVEMENT);
  1071.   DoMethod(lv1,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1072.     app,2,MUIM_Application_ReturnID,ID_DISPLAY);
  1073.   
  1074.   DoMethod(BT_SetProduction,MUIM_Notify,MUIA_Pressed,
  1075.     FALSE,app,2,MUIM_Application_ReturnID,ID_SETPRODUCTION);
  1076.   DoMethod(BT_ClearProduction,MUIM_Notify,MUIA_Pressed,
  1077.     FALSE,app,2,MUIM_Application_ReturnID,ID_CLEARPRODUCTION);
  1078.  
  1079.     
  1080.   DoMethod(lv11,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1081.     app,2,MUIM_Application_ReturnID,ID_BUYSHIP);
  1082.     
  1083.   DoMethod(lv6,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1084.     app,2,MUIM_Application_ReturnID,ID_SETFLEET);
  1085.   
  1086.   DoMethod(lv16,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1087.     app,2,MUIM_Application_ReturnID,ID_SHOWSHIPS);
  1088.   
  1089.   DoMethod(sl36,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, 
  1090.     app,2,MUIM_Application_ReturnID,ID_DESIGNCOST);
  1091.   DoMethod(sl37,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, 
  1092.     app,2,MUIM_Application_ReturnID,ID_DESIGNCOST);
  1093.   DoMethod(sl38,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, 
  1094.     app,2,MUIM_Application_ReturnID,ID_DESIGNCOST);
  1095.   DoMethod(sl39,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, 
  1096.     app,2,MUIM_Application_ReturnID,ID_DESIGNCOST);
  1097.   DoMethod(sl40,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, 
  1098.     app,2,MUIM_Application_ReturnID,ID_DESIGNCOST);
  1099.   DoMethod(sl41,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, 
  1100.     app,2,MUIM_Application_ReturnID,ID_SECTORINFO);
  1101.   DoMethod(sl42,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime, 
  1102.     app,2,MUIM_Application_ReturnID,ID_SECTORINFO);  
  1103.     
  1104.    
  1105.   DoMethod(lv3,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1106.     app,2,MUIM_Application_ReturnID,ID_TOPLANET);
  1107.   DoMethod(lv7,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1108.     app,2,MUIM_Application_ReturnID,ID_FROMSECTOR1);
  1109.   DoMethod(lv8,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1110.     app,2,MUIM_Application_ReturnID,ID_FROMPLANET);
  1111.   DoMethod(lv10,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1112.     app,2,MUIM_Application_ReturnID,ID_FROMFLEET);
  1113.   DoMethod(lv9,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime, 
  1114.     app,2,MUIM_Application_ReturnID,ID_FROMSECTOR2);
  1115.   DoMethod(BT_AddPlayer,MUIM_Notify,MUIA_Pressed,FALSE, 
  1116.     app,2,MUIM_Application_ReturnID,ID_ADDPLAYER);
  1117.   DoMethod(sl10,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1118.     app,2,MUIM_Application_ReturnID,ID_FUEL);
  1119.   DoMethod(sl11,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1120.     app,2,MUIM_Application_ReturnID,ID_FUEL);
  1121.   DoMethod(sl12,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1122.     app,2,MUIM_Application_ReturnID,ID_FUEL);
  1123.   DoMethod(sl13,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1124.     app,2,MUIM_Application_ReturnID,ID_FUEL);
  1125.   DoMethod(sl14,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1126.     app,2,MUIM_Application_ReturnID,ID_FUEL);
  1127.   DoMethod(sl15,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1128.     app,2,MUIM_Application_ReturnID,ID_FUEL);
  1129.   DoMethod(sl17,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1130.     app,2,MUIM_Application_ReturnID,ID_DESTINATION);
  1131.   DoMethod(sl18,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1132.     app,2,MUIM_Application_ReturnID,ID_DESTINATION);
  1133.   DoMethod(sl10,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1134.    app,2,MUIM_Application_ReturnID,ID_CARGO);
  1135.   DoMethod(sl8,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1136.    app,2,MUIM_Application_ReturnID,ID_CARGO);
  1137.   DoMethod(sl9,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1138.    app,2,MUIM_Application_ReturnID,ID_CARGO);
  1139.   DoMethod(sl16,MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  1140.    app,2,MUIM_Application_ReturnID,ID_CARGO);
  1141.   DoMethod(lv1,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,
  1142.     app,2,MUIM_Application_ReturnID,ID_ENABLEPURCHASE);
  1143.   DoMethod(lv4,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,
  1144.     app,2,MUIM_Application_ReturnID,ID_ITEMCOST);  
  1145.   DoMethod(BT_RemovePlayer,MUIM_Notify,MUIA_Pressed,FALSE,
  1146.     lv2,2,MUIM_List_Remove,MUIV_List_Remove_Active);
  1147.  
  1148.  
  1149.   DoMethod(WI_Configuration,MUIM_Window_SetCycleChain,str6,lv2,str1,
  1150.      BT_AddPlayer,BT_RemovePlayer,BT_Done,BT_Cancel,NULL);
  1151.   DoMethod(WI_Movement,MUIM_Window_SetCycleChain,lv12,sl17,sl18,lv3,lv5,
  1152.      BT_LastForce,BT_NextForce,BT_FleetCargo,BT_AutoFuel,BT_ClearCourse,BT_SendPartial,
  1153.      BT_Sellship, pop1,str9,pop2,str10,BT_ApplyTrade,BT_CancelTrade,NULL);
  1154.     
  1155.   DoMethod(WI_Mainwindow,MUIM_Window_SetCycleChain,BT_LastPlanet,
  1156.     BT_NextPlanet,str3,sl32,lv1,BT_LastPlayer,BT_NextPlayer,BT_Map,BT_Purchase,
  1157.     BT_Movement,BT_PlanetCargo,lv6,str5,sl41,sl42,lv16,lv17,NULL); 
  1158.   
  1159.   DoMethod(WI_Purchase,MUIM_Window_SetCycleChain,lv11,sl35,BT_PurchaseShip,BT_ShipDesign,lv4,
  1160.     sl1,BT_MakePurchase,NULL);
  1161.   
  1162.   DoMethod(WI_Login,MUIM_Window_SetCycleChain,str13,str14,str15,BT_PlayGame,NULL); 
  1163.  
  1164. /*
  1165.   DoMethod(pcy1,MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,
  1166.      pgr1,3,MUIM_Set,MUIA_Group_ActivePage,MUIV_TriggerValue);
  1167. */  
  1168.   DoMethod(pcy2,MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,
  1169.      pgr2,3,MUIM_Set,MUIA_Group_ActivePage,MUIV_TriggerValue);
  1170.  
  1171.   DoMethod(app,MUIM_Application_Load,MUIV_Application_Load_ENVARC);
  1172.   
  1173.   if (!app) fail(app,"Failed to create application.");
  1174.  
  1175.   
  1176.   /* we need to initialize the game with values from the server 
  1177.      such as GALAXY */ 
  1178.     
  1179.   empire_talk(myentity, serverentity);
  1180.    
  1181.   DoMethod(app,MUIM_Application_Save,MUIV_Application_Save_ENVARC);
  1182.   set(WI_Login,MUIA_Window_Open,FALSE);         
  1183.   set(WI_Mainwindow,MUIA_Window_Open,FALSE);
  1184.   
  1185.   MUI_DisposeObject(app);
  1186.     
  1187.   FreeClass(MyClass);          /* free our custom class.         */
  1188.   MUI_FreeClass(SuperClass);   /* release super class pointer.   */
  1189.   
  1190.   fail(NULL,NULL);             /* exit, app is already disposed. */
  1191. }
  1192.  
  1193.  
  1194.  
  1195. LONG guiRequest(LONG id) {
  1196.   
  1197.   switch (id) {
  1198.      case 1:
  1199.        return(MUI_Request(app,WI_Mainwindow,0,"Quiting MUIEmpire...", "Quit|*Cancel", "Are you sure you want to Quit!"));
  1200.        break;
  1201.      case 2:
  1202.        MUI_Request(app,WI_Mainwindow,0,NULL, "OK", "Not enough fuel to load fleet!");
  1203.        break;
  1204.      case 3:
  1205.        MUI_Request(app,WI_Mainwindow,0,NULL, "OK", "You do not have enough cargo space for a full load of fuel!"); 
  1206.        break;
  1207.      case 4:
  1208.        MUI_Request(app,WI_Mainwindow,0,NULL, "OK", "You do not own the planet!");                 
  1209.        break; 
  1210.      case 5: 
  1211.        MUI_Request(app,WI_ShipDesign,0,NULL, "OK", "Not enough credits for ship design");
  1212.        break; 
  1213.      case 6:
  1214.        MUI_Request(app,WI_Mainwindow,0,NULL, "OK", VSTRING);
  1215.        break;
  1216.      case 7:
  1217.        MUI_Request(app, WI_Mainwindow, 0, NULL, "OK", "ATTENTION!!!, A human has conquered the galaxy! The Game is Over.");
  1218.        break;
  1219.      case 8: 
  1220.        MUI_Request(app, WI_Mainwindow, 0, NULL, "OK", "ATTENTION!!!, The computer has conquered the puny human players! The Game is Over.");
  1221.        break;
  1222.      case 9:
  1223.        MUI_Request(app, WI_Mainwindow, 0, NULL, "OK", "Attention! It is your turn.");
  1224.        break;
  1225.      
  1226.      case 10:
  1227.        MUI_Request(app, WI_Mainwindow, 0, NULL, "OK", "Your password must atleast be 6 characters");
  1228.        break;
  1229.                
  1230.           
  1231.   }
  1232.   return(0);
  1233.  
  1234.  
  1235. }
  1236.  
  1237. int empire_talk(struct Entity *myentity,struct Entity *serverentity)
  1238. {
  1239.   /* envoy stuff */
  1240.   struct Transaction *trans;
  1241.   ULONG bitnumber,error_code;
  1242.  
  1243.   short quit = FALSE;
  1244.   LONG id = -1,*temp;
  1245.   int length;
  1246.   APTR data;
  1247.   char *string;
  1248.                         
  1249.   if (app) {
  1250.     if(NIPCBase = OpenLibrary("nipc.library",37L)) {
  1251.       if(ServicesBase = OpenLibrary("services.library",37L))
  1252.       {
  1253.       if(myentity = CreateEntity(ENT_AllocSignal, &bitnumber, TAG_DONE))
  1254.         {
  1255.         if(serverentity = FindService(host,"MUIEmpire_Service",myentity,FSVC_Error,&error_code,
  1256.               TAG_DONE))
  1257.            {
  1258.            set(WI_Login,MUIA_Window_Open,TRUE);
  1259.            
  1260.            set(str13,MUIA_String_Contents,&name);
  1261.            set(str14,MUIA_String_Contents,&password);
  1262.            set(str15,MUIA_String_Contents,&game);
  1263.          
  1264.            set(BT_Showships,MUIA_Selected,TRUE);   
  1265.            in  = myentity;
  1266.            out = serverentity;
  1267.            while(!quit)
  1268.               {
  1269.               /* you might listen to other signals here
  1270.               */
  1271.  
  1272.                  /* get input from the user and send it to the other side or
  1273.                     set up for a quit...
  1274.                  */
  1275.                  switch(id=guiinput()){
  1276.                        case ID_QUIT:
  1277.                        case MUIV_Application_ReturnID_Quit:
  1278.                        case ID_CANCEL:
  1279.                           if (guiRequest(1)) { 
  1280.                              quit = TRUE;
  1281.                              data = &id; 
  1282.                              senddata (in,out,2*sizeof(LONG), CSDATA,GUI_SEND,&id);
  1283.                              if(trans = AllocTransaction(TRN_AllocReqBuffer,NULL,TAG_DONE))
  1284.                              {
  1285.                                 trans->trans_Command = CSKILL;
  1286.                                 BeginTransaction(out,in,trans);
  1287.                              }
  1288.                           }
  1289.                           break;
  1290.                        default:
  1291.                           if (id == ID_PLAYGAME) {
  1292.                              get(str15,MUIA_String_Contents,&string);
  1293.                              if (string) {
  1294.                                   length = sizeof(LONG)+sizeof(char[30]);
  1295.                                   temp = AllocVec(length,MEMF_CLEAR|MEMF_ANY);
  1296.                                   if (temp) {
  1297.                                       temp[0] = ID_PLAYGAME;
  1298.                                       strcpy(&temp[1],string);
  1299.                                       senddata (in,out,length, CSDATA,GUI_SEND,temp);
  1300.                                       FreeVec(temp);
  1301.                                    }
  1302.                              }
  1303.                           }   
  1304.                           else if (id>0) {
  1305.                              data = &id;
  1306.                              senddata (in,out,2*sizeof(LONG), CSDATA,GUI_SEND,&id);
  1307.                           }
  1308.                           break;
  1309.                  }
  1310.               while (trans = GetTransaction(myentity)) {
  1311.                  if (trans->trans_Type == TYPE_RESPONSE) FreeTransaction(trans);
  1312.                  else if (trans->trans_Command == CSDATA)  /** its data from the MUX for us **/
  1313.                  {
  1314.                      processdata(in,out,trans);
  1315.                      ReplyTransaction(trans);
  1316.                  }
  1317.                  else if (trans->trans_Command == SCKILL)
  1318.                  {
  1319.                      /** we are being asked to quit... **/
  1320.                      quit = TRUE;
  1321.                      printf("Server killing client");
  1322.                      ReplyTransaction(trans);
  1323.                      Delay(30L);
  1324.                  }
  1325.                  else if (trans->trans_Command == DIENOW)
  1326.                  {
  1327.                      quit = TRUE;
  1328.                      ReplyTransaction(trans);
  1329.                      printf("Forced Shut Down!\n");
  1330.                      Delay(30L);
  1331.                  }
  1332.                }
  1333.              if ((!quit) && signals) Wait((signals) | (1 << bitnumber));
  1334.              }
  1335.              LoseService(serverentity);
  1336.            }
  1337.            else printf("Couldn't connect to server! error %d\n",error_code);
  1338.            DeleteEntity(myentity);
  1339.          }
  1340.          CloseLibrary(ServicesBase);
  1341.         }
  1342.         CloseLibrary(NIPCBase); 
  1343.       }
  1344.     }
  1345.     return(0);
  1346. }
  1347.  
  1348. ULONG guiinput ()
  1349. {
  1350.     
  1351.   return(DoMethod(app,MUIM_Application_Input,&signals));
  1352.  
  1353. }
  1354.  
  1355. int processdata (struct Entity *in, struct Entity *out,struct Transaction *trans) {
  1356.   
  1357.   int length;
  1358.   int number;
  1359.   char *data = NULL;
  1360.   LONG messagetype = 0;    /* type of message set,get */
  1361.   static LONG data1,data2,data3,data4;
  1362.   LONG address=0;
  1363.   LONG datasize=0;
  1364.   APTR *pointer =NULL;
  1365.   LONG object =0;
  1366.   LONG *message = NULL;
  1367.   struct Sector *newsector;
  1368.   struct Empires *newempire;
  1369.     
  1370.   /* two types of messages, display info or request GUI settings */
  1371.   
  1372.   length = trans->trans_ReqDataActual;
  1373.   
  1374.   address = (LONG)&tx1;
  1375.     
  1376.   DoMethod(app,MUIM_Application_InputBuffered);
  1377.   if (length) {
  1378.      message     = (LONG *)trans->trans_RequestData;
  1379.      messagetype = message[0];
  1380.      if (messagetype == GUI_DONE) 
  1381.         {
  1382.         return(0);
  1383.         }
  1384.      datasize    = message[1];
  1385.      object      = message[2];
  1386.      address += object*sizeof(LONG); /* first object */
  1387.      pointer  = (APTR *)address;
  1388.      switch(messagetype) { 
  1389.         case GUI_SETUPDATE:
  1390.            data1 = message[3];
  1391.            if (datasize == sizeof(LONG)) set(*pointer,data1,message[4]);
  1392.            else set(*pointer,data1,&message[4]);
  1393.            break;
  1394.            
  1395.         case GUI_GET:
  1396.            data2 = message[3];
  1397.            if (datasize != sizeof(LONG)) get(*pointer,data2,&data);
  1398.            else {
  1399.               get(*pointer,data2,&number);
  1400.               data = (char *)&number;
  1401.            }
  1402.            senddata(in,out,datasize+sizeof(LONG),trans->trans_Command,messagetype,data);
  1403.            break;
  1404.  
  1405.         case GUI_DOMETHODGET3:
  1406.            data1 = message[3];
  1407.            if (datasize>0) {
  1408.              DoMethod(*pointer,data1,&id);
  1409.              senddata(in,out,datasize+sizeof(LONG),trans->trans_Command,messagetype,&id);
  1410.            }
  1411.            else {
  1412.               data2 = message[4];
  1413.               DoMethod(*pointer,data1,data2);
  1414.            }
  1415.            break;
  1416.         
  1417.         case GUI_DOMETHODGET4:/* fourth pointer to data */
  1418.            data1 = message[3];
  1419.            data2 = message[4];
  1420.            data3 = message[5];
  1421.            DoMethod(*pointer,data1,data2,&data3);
  1422.            if (data3 == NULL) senddata(in,out,datasize+sizeof(LONG),trans->trans_Command,GUI_NULL,&data3);
  1423.            else senddata(in,out,datasize+sizeof(LONG),trans->trans_Command,messagetype,data3);
  1424.            break;
  1425.         
  1426.         case GUI_DOMETHODGET5:/* third pointer to data */
  1427.            data1 = message[3];
  1428.            data2 = message[4];
  1429.            data3 = message[5];
  1430.            data4 = message[6];
  1431.            data = (char *)(&message[7]);
  1432.            if (datasize == sizeof(LONG)) DoMethod(*pointer,data1,message[7],data3,data4);
  1433.            else DoMethod(*pointer,data1,&data,data3,data4);
  1434.            break;        
  1435.         case GUI_REQUEST:
  1436.            data1 = message[3];
  1437.            guiRequest(data1);
  1438.            break;
  1439.       
  1440.         case GUI_INITIALSETUP:
  1441.            GALAXY = message[3];
  1442.            if ((message[4] != VERSION) || (message[5] != REVISION)) {
  1443.               guiRequest(11);
  1444.               return(0);
  1445.            }
  1446.            imagesetup();
  1447.            break;
  1448.         
  1449.         case GUI_MAP:
  1450.            if (newsector = AllocVec(sizeof(struct Sector),MEMF_CLEAR|MEMF_ANY)) {
  1451.               memcpy(newsector,&message[1],sizeof(struct Sector));
  1452.               newsector->next = NULL;
  1453.               if (lastsector) lastsector->next = newsector;
  1454.               if (newsector->planet) newsector->text.IText = newsector->planetname;
  1455.               if (!firstsector) lastsector = firstsector = newsector;
  1456.               else lastsector = newsector;
  1457.            }
  1458.            break;
  1459.         case GUI_MAPCLEAR:
  1460.            while (firstsector) {
  1461.               newsector = firstsector;
  1462.               firstsector = firstsector->next;
  1463.               FreeVec(newsector);        
  1464.            }
  1465.            firstsector = lastsector = NULL;
  1466.            break;
  1467.            
  1468.         case GUI_EMPIRE:
  1469.            if (newempire = AllocVec(sizeof(struct Empires),MEMF_CLEAR|MEMF_ANY)) {
  1470.               memcpy(newempire,&message[1],sizeof(struct Empires));
  1471.               newempire->next = NULL;
  1472.               if (lastempire) lastempire->next = newempire;
  1473.               if (!firstempire) lastempire = firstempire = newempire;
  1474.               else lastempire = newempire;
  1475.            }
  1476.            break;
  1477.         case GUI_EMPIRECLEAR:
  1478.            while (firstempire) {
  1479.               newempire = firstempire;
  1480.               firstempire = firstempire->next;
  1481.               FreeVec(newempire);        
  1482.            }
  1483.            firstempire = lastempire = NULL;
  1484.            break;
  1485.  
  1486.       }
  1487.         
  1488.   }
  1489.   return(0);
  1490. }
  1491.  
  1492.    
  1493. int senddata (struct Entity *myentity,struct Entity *serverentity,int length, short datatype,LONG datamessage,APTR data) {
  1494.   
  1495.   struct Transaction *trans;
  1496.   LONG *temp;
  1497.   
  1498.   if(trans = AllocTransaction(TRN_AllocReqBuffer,length,TAG_DONE))
  1499.      {
  1500.      if (temp = AllocMem(length,MEMF_CLEAR|MEMF_ANY)) {
  1501.         if (!data) length = sizeof(LONG);
  1502.         trans->trans_ReqDataActual  = length;
  1503.         if (datamessage != GUI_NULL) 
  1504.         memcpy(&temp[1],data,(length-sizeof(LONG)));
  1505.         temp[0] = datamessage;
  1506.         memcpy(trans->trans_RequestData,&temp[0],length);
  1507.         trans->trans_Command        = datatype;
  1508.         BeginTransaction(serverentity,myentity,trans);  /** send message **/
  1509.         FreeMem(temp,length);
  1510.      }
  1511.   }
  1512.   if (length>240) printf("data too large\n");
  1513.   return(0);
  1514.  
  1515. }
  1516.  
  1517. __saveds __asm struct shiptag *consship(register __a0 struct Hook *hook,
  1518.                                         register __a2 APTR mem_pool,
  1519.                                         register __a1 struct ship *ship)
  1520. {
  1521.     struct shiptag *new;
  1522.     
  1523.     new=AllocVec(sizeof(struct shiptag),MEMF_ANY|MEMF_CLEAR);
  1524.     if (new) {
  1525.         strcpy(new->name,ship->name);
  1526.         new->id=ship->id;
  1527.         stci_d(new->attack,ship->attack);
  1528.         stci_d(new->defense,ship->defense);
  1529.         stci_d(new->speed,ship->speed);
  1530.         stci_d(new->cargo,ship->cargo);
  1531.         stci_d(new->fuel,ship->fuel);
  1532.         stci_d(new->cost,ship->cost);        
  1533.         stci_d(new->tech,ship->tech);
  1534.         return(new);}    
  1535.     return(0);
  1536. }
  1537.  
  1538. __saveds __asm struct tagchar *constag(register __a0 struct Hook *hook,
  1539.                                       register __a2 APTR mem_pool,
  1540.                                       register __a1 struct tagchar *tag)
  1541. {
  1542.     struct tagchar *new;
  1543.     
  1544.     new=AllocVec(sizeof(struct tagchar),MEMF_ANY|MEMF_CLEAR);
  1545.     if (new) {
  1546.         strcpy(new->name,tag->name);        
  1547.         strcpy(new->amount,tag->amount);
  1548.         new->tagname = tag->tagname;
  1549.         new->tagdata = tag->tagdata;
  1550.         return(new);}    
  1551.     return(0);
  1552. }
  1553.  
  1554. SAVEDS ASM LONG desfleet(register __a0 struct Hook *hook, 
  1555.                          register __a2 APTR mem_pool,
  1556.                          register __a1 struct temp *fleet)
  1557. {
  1558.     FreeVec(fleet);
  1559.     return(0);
  1560. }
  1561.  
  1562. SAVEDS ASM LONG desship(register __a0 struct Hook *hook, 
  1563.                          register __a2 APTR mem_pool,
  1564.                          register __a1 struct shiptag *ship)
  1565. {
  1566.     FreeVec(ship);
  1567.     return(0);
  1568. }
  1569.  
  1570.  
  1571. SAVEDS ASM LONG destag  (register __a0 struct Hook *hook, 
  1572.                          register __a2 APTR mem_pool,
  1573.                          register __a1 struct tagchar *tag)
  1574. {
  1575.     FreeVec(tag);
  1576.     return(0);
  1577. }
  1578.  
  1579.  
  1580. SAVEDS ASM LONG dispfleet(register __a0 struct Hook *hook, 
  1581.                           register __a2 char **array,
  1582.                           register __a1 struct temp *fleet)
  1583. {
  1584.     if (fleet)
  1585.       {
  1586.       *array++ = fleet->x;
  1587.       *array++ = fleet->y;
  1588.       *array++ = fleet->planet;
  1589.       *array++ = fleet->empire;
  1590.       *array++ = fleet->attack;
  1591.       *array++ = fleet->defense;
  1592.       *array++ = fleet->speed;
  1593.       *array++ = fleet->cargo;
  1594.       *array++ = fleet->maxcargo;
  1595.       *array++ = fleet->range;
  1596.       *array++ = fleet->tox;
  1597.       *array++ = fleet->toy;
  1598.       *array   = fleet->destination;
  1599.       
  1600.       }
  1601.     else {
  1602.       *array++ = "X";
  1603.       *array++ = "Y";
  1604.       *array++ = "Planet";
  1605.       *array++ = "Empire";
  1606.       *array++ = "Attack";
  1607.       *array++ = "Deffense";
  1608.       *array++ = "Speed";
  1609.       *array++ = "Cargo";
  1610.       *array++ = "MaxCargo";
  1611.       *array++ = "Range";
  1612.       *array++ = "To X";
  1613.       *array++ = "To Y";
  1614.       *array   = "Orders";
  1615.       
  1616.       }
  1617.     return(0);
  1618.   
  1619. }
  1620.  
  1621. SAVEDS ASM LONG dispship(register __a0 struct Hook *hook, 
  1622.                           register __a2 char **array,
  1623.                           register __a1 struct shiptag *ship)
  1624. {
  1625.     if (ship)
  1626.       {
  1627.       *array++ = ship->name;
  1628.       *array++ = ship->attack;
  1629.       *array++ = ship->defense;
  1630.       *array++ = ship->speed;
  1631.       *array++ = ship->cargo;
  1632.       *array++ = ship->fuel;
  1633.       *array   = ship->cost;
  1634.       }
  1635.     else {
  1636.       *array++ = "Type";
  1637.       *array++ = "Att";
  1638.       *array++ = "Def";
  1639.       *array++ = "Spd";
  1640.       *array++ = "Carg";
  1641.       *array++ = "Fuel";
  1642.       *array   = "Cost";
  1643.     }
  1644.     return(0);
  1645. }
  1646.  
  1647. SAVEDS ASM LONG disptag  (register __a0 struct Hook *hook, 
  1648.                           register __a2 char **array,
  1649.                           register __a1 struct tagchar *tag)
  1650. {
  1651.     if (tag)
  1652.       {
  1653.       *array++ = tag->amount;
  1654.       *array   = tag->name;
  1655.     }
  1656.     else {
  1657.       *array++ = "Number";
  1658.       *array   = "Item";
  1659.       }
  1660.     return(0);
  1661. }
  1662.  
  1663. SAVEDS ASM LONG disppurch  (register __a0 struct Hook *hook, 
  1664.                            register __a2 char **array,
  1665.                            register __a1 struct tagchar *tag)
  1666. {
  1667.     if (tag)
  1668.       {
  1669.       *array++ = tag->amount;
  1670.       *array   = tag->name;
  1671.       }
  1672.     else {
  1673.       *array++ = "Cost";
  1674.       *array   = "Item";
  1675.       }
  1676.     return(0);
  1677. }
  1678.  
  1679. __saveds __asm struct temp *consfleet(register __a0 struct Hook *hook,
  1680.                                       register __a2 APTR mem_pool,
  1681.                                       register __a1 struct force *fleet)
  1682. {
  1683.       
  1684.     struct temp *new;
  1685.     int x,y;
  1686.     struct Sector *sector;
  1687.     struct Empires *empire;
  1688.     
  1689.     new=AllocVec(sizeof(struct temp),MEMF_ANY|MEMF_CLEAR);
  1690.     if (new) {
  1691.         x = fleet->x;
  1692.         y = fleet->y;
  1693.         stci_d(new->x,x);
  1694.         stci_d(new->y,y);
  1695.         sector = firstsector;
  1696.         strcpy(new->planet,"\n");
  1697.         while (sector) {
  1698.            if ((sector->x == x) && (sector->y ==y)) {
  1699.               strcpy(new->planet,sector->planetname);
  1700.               break;
  1701.            }
  1702.            sector = sector->next;
  1703.         }
  1704.         if (fleet->id==0) strcpy(new->empire,"Independent");
  1705.         else {  
  1706.           empire = firstempire;
  1707.           while (empire) {
  1708.             if (empire->id == fleet->id) {
  1709.               strcpy(new->empire,fleet->empire);
  1710.               break;
  1711.             }
  1712.             empire = empire->next;
  1713.           }
  1714.         }
  1715.         stci_d(new->attack,fleet->attack);
  1716.         stci_d(new->defense,fleet->defense);
  1717.         stci_d(new->speed,fleet->maxmove);
  1718.         stci_d(new->cargo,fleet->cargo);
  1719.         stci_d(new->maxcargo,fleet->maxcargo);
  1720.         stci_d(new->range,(fleet->fuel/fleet->fuelturn));      
  1721.         new->ship = fleet->this;
  1722.         if (fleet->planet1 != fleet->planet2) strcpy(new->destination,"Trade");
  1723.         else if (fleet->nextsector) strcpy(new->destination,"In Flight");                
  1724.         return(new);
  1725.       }    
  1726.     return(0);
  1727. }
  1728.  
  1729.  
  1730. /*************************/
  1731. /* Init & Fail Functions */
  1732. /*************************/
  1733.  
  1734. VOID fail(APTR app,char *str)
  1735. {
  1736.      struct Sector *nextsector;
  1737.      struct Empires *nextempire;
  1738.      
  1739.      nextsector = firstsector;
  1740.      while (nextsector) {
  1741.         firstsector = nextsector;
  1742.         nextsector = nextsector->next;
  1743.         FreeVec(firstsector);
  1744.      }
  1745.      
  1746.      nextempire = firstempire;
  1747.      while (nextempire) {
  1748.         firstempire = nextempire;
  1749.         nextempire = nextempire->next;
  1750.         FreeVec(firstempire);
  1751.      }
  1752.  
  1753.         
  1754.      
  1755.     
  1756.         if (app)
  1757.                 MUI_DisposeObject(app);
  1758.  
  1759. #ifndef _DCC
  1760.         if (MUIMasterBase)
  1761.                 CloseLibrary(MUIMasterBase);
  1762.         if (UtilityBase)
  1763.                 CloseLibrary(UtilityBase);
  1764.  
  1765. #endif
  1766.  
  1767.         if (str)
  1768.         {
  1769.                 puts(str);
  1770.                 exit(20);
  1771.         }
  1772.     
  1773.         exit(0);
  1774. }
  1775.  
  1776.  
  1777. BOOL parse( int argc )
  1778. {
  1779.     LONG    *ArgumentArray;        /* array for storing arguments retrieved by */
  1780.     const char none[]="None Given";
  1781.  
  1782.     if (!(ArgumentArray = ParseParameters(argc, "Host/K,Name/K,Password/K")))
  1783.     {
  1784.         FreeParameters(ArgumentArray);
  1785.         return(FALSE);
  1786.     }
  1787.     else
  1788.     {
  1789.         if (ArgumentArray[HOST])
  1790.         {
  1791.             strcpy(host,(char *)ArgumentArray[HOST]);
  1792.         }
  1793.         else
  1794.         {
  1795.             strcpy(host,none);
  1796.         }
  1797.      
  1798.      if (ArgumentArray[NAME])
  1799.         {
  1800.         strcpy(name,(char *)ArgumentArray[NAME]);
  1801.         }
  1802.      else
  1803.         {
  1804.             strcpy(name,none);
  1805.         }
  1806.      
  1807.      if (ArgumentArray[PASSWORD])
  1808.         {
  1809.         strcpy(password,(char *)ArgumentArray[PASSWORD]);
  1810.         }
  1811.      else
  1812.         {
  1813.             strcpy(password,none);
  1814.         }
  1815.  
  1816.         FreeParameters(ArgumentArray);
  1817.  
  1818.         return(TRUE);
  1819.     }
  1820.  
  1821. }
  1822.  
  1823. LONG *ParseParameters(int argc, char *OriginalTemplate)
  1824. {
  1825.     LONG    *ArgumentArray;        /* array for storing arguments retrieved by */
  1826.  
  1827.     char    **ToolArrayIndex,    /* workbench tooltypes array */
  1828.             *ToolStringIndex,    /* index into string of concatenated workbench tooltypes */
  1829.             *Template;            /* readargs template - varies slightly for WB or CLI */
  1830.  
  1831.     struct DiskObject    *DiskObject;    /* pointer to diskobject associated with program icon */
  1832.     WORD    ArgCount = 1;        /* number of arguments in template */
  1833.  
  1834.     RDA = AllocDosObjectTags(DOS_RDARGS, TAG_DONE);
  1835.     RDA->RDA_ExtHelp = NULL;
  1836.  
  1837.     Template = AllocVec(strlen(OriginalTemplate)+16,MEMF_CLEAR);
  1838.  
  1839.     for (    ToolStringIndex = OriginalTemplate;
  1840.             ToolStringIndex = strchr(ToolStringIndex,',');
  1841.              ToolStringIndex++, ArgCount++);
  1842.  
  1843.     ArgumentArray = AllocVec((ArgCount+1)*4,MEMF_CLEAR);
  1844.  
  1845.     if (argc==0)
  1846.     {
  1847.         if (IconBase = OpenLibrary("icon.library", 36L) )
  1848.         {
  1849.             CurrentDir(_WBenchMsg->sm_ArgList->wa_Lock);
  1850.  
  1851.             if (DiskObject = GetDiskObject(_WBenchMsg->sm_ArgList->wa_Name))
  1852.             {
  1853.                 for (    ToolArrayIndex = DiskObject->do_ToolTypes;
  1854.                         *ToolArrayIndex;
  1855.                         ToolArrayIndex++)
  1856.                 {
  1857.                     RDA->RDA_Source.CS_Length += (strlen(*ToolArrayIndex)+1);
  1858.                 }
  1859.  
  1860.                 if (RDA->RDA_Source.CS_Length)
  1861.                 {
  1862.                     RDA->RDA_Source.CS_Buffer = AllocVec(RDA->RDA_Source.CS_Length+1,MEMF_CLEAR);
  1863.                     ToolStringIndex = RDA->RDA_Source.CS_Buffer;
  1864.  
  1865.                     for (    ToolArrayIndex = DiskObject->do_ToolTypes;
  1866.                             *ToolArrayIndex;
  1867.                             ToolArrayIndex++)
  1868.                     {
  1869.                         ToolStringIndex = stpcpy(stpcpy(ToolStringIndex,*ToolArrayIndex)," ");
  1870.                     }
  1871.  
  1872.                     *(ToolStringIndex-1) = '\n';
  1873.                     FreeDiskObject(DiskObject);
  1874.                 }
  1875.             }
  1876.         }
  1877.  
  1878.         stpcpy(stpcpy(Template,OriginalTemplate),",ThrowAway/M");
  1879.  
  1880.     }
  1881.     else
  1882.     {
  1883.         strcpy(Template,OriginalTemplate);
  1884.     }
  1885.  
  1886.     RDA = ReadArgs(Template,ArgumentArray,RDA);
  1887.  
  1888.     FreeVec(Template);
  1889.  
  1890.     if (RDA)
  1891.     {
  1892.         return(ArgumentArray);
  1893.     }
  1894.     else
  1895.     {
  1896.         return(NULL);
  1897.     }
  1898. }
  1899.  
  1900. void FreeParameters(LONG *ArgumentArray)
  1901. {
  1902.     if (RDA)
  1903.     {
  1904.         if ((RDA->RDA_Source.CS_Length) && (RDA->RDA_Source.CS_Buffer))
  1905.         {
  1906.             FreeVec(RDA->RDA_Source.CS_Buffer);
  1907.         }
  1908.  
  1909.         FreeArgs(RDA);
  1910.         FreeDosObject(DOS_RDARGS,RDA);
  1911.     }
  1912.     else
  1913.     {
  1914.         PrintFault(IoErr(), NULL);
  1915.     }
  1916.  
  1917.     if (ArgumentArray)
  1918.     {
  1919.         FreeVec(ArgumentArray);
  1920.     }
  1921. }
  1922.  
  1923.